﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PraxisRent.Entities;
using System.Data;
using System.Data.Objects;

namespace PraxisRent.Repository
{
    public class PersonaRepository:MasterRepository, IPersonaRepository
    {
        public List<PERSONA> GetAllFromPersona()
        {
            var query = from c in context.PERSONAs.Include("SEXO").Include("ESTADO_CIVIL")
                        select c;
            return query.ToList();
        }

        public List<PERSONA> GetAllFromPersonaByCriterio(string criterio)
        {
            var query = from c in context.PERSONAs.Include("SEXO").Include("ESTADO_CIVIL").Include("USUARIO")
                        select c;
            if (criterio != null && criterio != string.Empty && criterio != "")
            {
                query = from c in context.PERSONAs.Include("SEXO").Include("ESTADO_CIVIL").Include("USUARIO")
                        where c.ApeMaterno.ToUpper().Contains(criterio) ||
                        c.ApePaterno.ToUpper().Contains(criterio) ||
                        c.Nombres.ToUpper().Contains(criterio) ||
                        c.Dni.Contains(criterio)
                        select c;
            }
            return query.ToList();
        }

        public PERSONA GetAllFromPersonaById(int id)
        {
            var query = from c in context.PERSONAs.Include("SEXO").Include("ESTADO_CIVIL")
                        where c.Id.Equals(id)
                        select c;
            return query.SingleOrDefault();
        }

        public void AddPersona(PERSONA persona)
        {
            foreach (var item in persona.TELEFONO_PERSONAs)
            {
                item.OPERADOR = null;
                context.Entry(item).State = EntityState.Added;
            }

            persona.ESTADO_CIVIL = null;
            persona.SEXO = null;

            context.PERSONAs.Add(persona);
            context.SaveChanges();
        }

        public void UpdatePersona(PERSONA persona)
        {
            var personaDB = context.PERSONAs.Find(persona.Id);

            personaDB.ApeMaterno = persona.ApeMaterno;
            personaDB.ApePaterno = persona.ApePaterno;
            personaDB.Direccion = persona.Direccion;
            personaDB.Dni = persona.Dni;
            personaDB.Email = persona.Email;
            personaDB.EstadoCivilId = persona.EstadoCivilId;
            personaDB.Nombres = persona.Nombres;
            personaDB.SexoId = persona.SexoId;
            personaDB.FOTO_PERSONA = persona.FOTO_PERSONA;

            foreach (var item in persona.TELEFONO_PERSONAs)
            {
                item.OPERADOR = null;
                if (item.Id.Equals(0))
                {
                    item.PERSONA = personaDB;
                    item.OPERADOR = context.OPERADOR.Find(item.IdOperador);
                    context.Entry(item).State = EntityState.Added;
                    personaDB.TELEFONO_PERSONAs.Add(item);
                }
                else
                {
                    item.PERSONA = null;
                    context.TELEFONO_PERSONAs.Attach(item);
                    context.Entry(item).State = EntityState.Modified;
                    //item.PERSONA = null;
                }
            }

            context.Entry(personaDB.FOTO_PERSONA).State = EntityState.Modified;
            context.Entry(personaDB).State = EntityState.Modified;
            context.SaveChanges();
        }

        public void DeletePersona(int id)
        {
            var existe = context.PERSONAs.Find(id);

            if (existe != null)
            {
                context.PERSONAs.Remove(existe);
                context.SaveChanges();
            }
        }

        public PERSONA GetAllFromPersonaByDni(string dni)
        {
            var query = from c in context.PERSONAs
                        where c.Dni.Contains(dni)
                        select c;
            return query.SingleOrDefault();
        }
    }
}
